//
//  Problem1247.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/4/4.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1247. 交换字符使得字符串相同
 有两个长度相同的字符串 s1 和 s2，且它们其中 只含有 字符 "x" 和 "y"，你需要通过「交换字符」的方式使这两个字符串相同。

 每次「交换字符」的时候，你都可以在两个字符串中各选一个字符进行交换。

 交换只能发生在两个不同的字符串之间，绝对不能发生在同一个字符串内部。也就是说，我们可以交换 s1[i] 和 s2[j]，但不能交换 s1[i] 和 s1[j]。

 最后，请你返回使 s1 和 s2 相同的最小交换次数，如果没有方法能够使得这两个字符串相同，则返回 -1 。

 示例 1：
     输入：s1 = "xx", s2 = "yy"
     输出：1
     解释：
     交换 s1[0] 和 s2[1]，得到 s1 = "yx"，s2 = "yx"。
 示例 2：
     输入：s1 = "xy", s2 = "yx"
     输出：2
     解释：
     交换 s1[0] 和 s2[0]，得到 s1 = "yy"，s2 = "xx" 。
     交换 s1[0] 和 s2[1]，得到 s1 = "xy"，s2 = "xy" 。
     注意，你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx"，因为我们只能交换属于两个不同字符串的字符。
 示例 3：
     输入：s1 = "xx", s2 = "xy"
     输出：-1
 示例 4：
     输入：s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx"
     输出：4
 提示：
     1 <= s1.length, s2.length <= 1000
     s1, s2 只包含 'x' 或 'y'。
 */
@objcMembers class Problem1247: NSObject {
    func solution() {
        print(minimumSwap("xxyyxyxyxx", "xyyxyxxxyx"))
    }
    
    /*
     前提：
     1: xx 和 yy 只需要交换一次
     2: xy 和 yx 需要交换2次
     步骤
     1: 分别求出xy和yx的个数
     2: 一对xy 对应一步；一对yx 对应一步；
     3: 如果xy+yx的和是奇数，那么肯定不符合要求，因为他俩必须配对
     4: 按照步骤2的配对，如果剩下一个xy和yx说明要走2步
     5:
     */
    func minimumSwap(_ s1: String, _ s2: String) -> Int {
        let charts1 = Array(s1)
        let charts2 = Array(s2)
        
        var xy = 0
        var yx = 0
        for i in 0..<charts1.count {
            if charts1[i] != charts2[i] {
                if charts1[i] == "x" {
                    xy += 1
                } else {
                    yx += 1
                }
            }
        }
        if (xy + yx) % 2 == 1 {
            return -1
        }
        let result = xy / 2 + yx / 2
        return result + (xy % 2 == 0 ? 0 : 2)
    }
}
